package it.bela.pgcdc.service.impl;

import java.util.List;

import it.bela.pgcdc.common.exception.ServiceException;
import it.bela.pgcdc.common.utils.Utilities;
import it.bela.pgcdc.dao.AttivitaDao;
import it.bela.pgcdc.domain.Attivita;
import it.bela.pgcdc.service.AttivitaService;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
@Service
@Transactional(rollbackFor = ServiceException.class)
public class AttivitaServiceImpl implements AttivitaService {
	
	private static final Logger log = Logger.getLogger(AttivitaServiceImpl.class);
	
	@Autowired(required = true)
	private AttivitaDao attivitaDao;
	
	private boolean hasValidKey(Attivita attivita) {
		return (attivita.getId() != 0);
	}

	@Override
	public List<Attivita> findByExample(Attivita attivita) throws ServiceException {
		
		try {
			log.debug("Start list Attivita");
			
			attivita = (Attivita) Utilities.setDefaultParametersSelect(attivita);
			
			List<Attivita> list = attivitaDao.findByExample(attivita);
			
			log.debug("End list Attivita");
			
			return list;

		} catch (Exception e) {
			log.debug("findByExample Attivita failed" + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}

	public List<Attivita> list() throws ServiceException {
		
		try {
			log.debug("Start list");
			
			Attivita attivita = new Attivita();
			
			attivita = (Attivita) Utilities.setDefaultParametersSelect(attivita);

			List<Attivita> list = attivitaDao.findByExample(attivita);
			
			log.debug("End list");
			
			return list;

		} catch (Exception e) {
			log.debug("findByExample failed" + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}

	public boolean delete(Attivita attivita) throws ServiceException {
		log.debug(attivita.getClass().toString() + " - Start delete");
		
		String message = attivita.getClass().toString() + " - delete Attivita failed.";
		try {
			if (!hasValidKey(attivita)) {
				String messageInner = message + " Oggetto senza id.";
				log.debug(messageInner);
				throw new ServiceException(messageInner);
			}
			
			attivita = (Attivita) attivitaDao.findById(attivita.getClass(), attivita.getId());
			attivitaDao.delete(attivita);
			
			log.debug(attivita.getClass().toString() + " - End delete Attivita");
			return true;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}

	public boolean persist(Attivita attivita) throws ServiceException {
		log.debug(attivita.getClass().toString() + " - Start persist Attivita");
		
		String message = attivita.getClass().toString() + " - persist Attivita failed.";
		try {
			
			attivita = (Attivita) Utilities.setDefaultParametersInsert(attivita);
			attivitaDao.persist(attivita);
			
			log.debug(Attivita.class.toString() + " - End persist Attivita");
			return true;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}
	
	public boolean save(Attivita attivita) throws ServiceException {
		log.debug(attivita.getClass().toString() + " - Start save Attivita");
		
		String message = Attivita.class.toString() + " - save Attivita failed.";
		try {
			
			attivita = (Attivita) Utilities.setDefaultParametersInsert(attivita);
			attivitaDao.save(attivita);
			
			log.debug(Attivita.class.toString() + " - End save Attivita");
			return true;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}
	
	public boolean merge(Attivita attivita) throws ServiceException {
		log.debug(Attivita.class.toString() + " - Start merge Attivita");
		
		String message = Attivita.class.toString() + " - merge Attivita failed.";
		try {
			if (!hasValidKey(attivita)) {
				String messageInner = message + " Oggetto senza id.";
				log.debug(messageInner);
				throw new ServiceException(messageInner);
			}
			
			attivita = (Attivita) Utilities.setDefaultParametersUpdate(attivita);
			attivitaDao.merge(attivita);
			
			log.debug(Attivita.class.toString() + " - End merge Attivita");
			return true;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}
	
	public Attivita findById(Class<Attivita> classe, Long id)throws ServiceException {
		log.debug(Attivita.class.toString() + " - Start findById Attivita");
		
		String message = Attivita.class.toString() + " - findById Attivita failed.";
		try {
			
			Attivita attivita = (Attivita) attivitaDao.findById(classe, id);
			
			log.debug(Attivita.class.toString() + " - End findById Attivita");
			return attivita;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}
}
